﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DominioSATT;
using RepositorioSATT.Conexiones;
using System.Data;

namespace RepositorioSATT
{
    public class PartidoRepositorio : IPartidoRepositorio, IMapeadorFila<Partido>
    {
        protected Conexion conn;
        protected string sql;
        public PartidoRepositorio()
        {
            conn = new Conexion();
        }
        #region Miembros de IPartidoRepositorio

        public List<Partido> Listar(int IdTorneo)
        {
            sql = " select P.Nombre, P.Apellido, A.IdTorneo, A.IdSede, A.IdPartido, A.IdSede, A.Cancha, A.DniArbitro, ";
            sql += " A.Fecha, A.Ronda, A.Estado ";
            sql += " from Partidos A inner join ";
            sql += " (InscripcionPartido Z inner join Inscripcion I on Z.IdInscripcion = I.IdInscripcion) ";
            sql += " inner join Persona P on P.Dni = I.Dni ";
            sql += " on A.IdPartido = Z.IdPartido ";
            sql += " Where A.IdTorneo = " + IdTorneo;
            DataTable dt = conn.Listar(sql);
            List<Partido> Lista = new List<Partido>();
            foreach (System.Data.DataRow dr in dt.Rows)
            {
                Lista.Add(this.MapearTabla(dr));
            }
            if(Lista.Count > 0)
            {
                if (Lista.Count % 2 != 0)
                    Lista.Add(new Partido());
            }
            return Lista;
        }

        public Partido Obtener(int IdTorneo, DateTime Fecha, int Cancha)
        {
            sql = " Select * From Partidos Where IdTorneo = " + IdTorneo + " And Fecha = '" + string.Format("{0:yyyyMMdd}",Fecha) + "', And Cancha = " + Cancha;
            DataRow dr = conn.Buscar(sql);
            return this.MapearTabla(dr);
        }

        public Partido ObtenerPorId(int Id)
        {
            sql = " Select * From Partidos Where IdPartido = " + Id;
            DataRow dr = conn.Buscar(sql);
            return this.MapearTabla(dr);
        }

        public int Agregar(Partido Objeto)
        {
            string valores = Objeto.Torneo.Id + "," + Objeto.Sede.Idsede + "," + Objeto.Arbitro.Dni + "," + Objeto.Ronda + ",'" + string.Format("{0:yyyyMMdd}",Objeto.Fecha) + "'," + Objeto.Cancha + ",'" + Objeto.Estado + "'";
            return conn.Agregar("Partidos", "IdTorneo,IdSede,DniArbitro,Ronda,Fecha,Cancha,Estado", valores);
        }

        public void Modificar(Partido Objeto)
        {
            sql = " Update Partidos Set IdTorneo = " + Objeto.Torneo.Id + ", IdSede = " + Objeto.Sede.Idsede + ", Fecha = '" + string.Format("{0:yyyyMMdd}",Objeto.Fecha) + "', Cancha = '" + Objeto.Cancha + "', Estado = '" + Objeto.Estado + "' Where IdPartido = " + Objeto.Id;
            conn.ActualizarOEliminar(sql);
        }

        #endregion

        #region Miembros de IMapeadorFila<Partido>

        public Partido MapearTabla(System.Data.DataRow fila)
        {
            Partido retorno = null;
            if (fila != null)
            {
                ITorneoRepositorio repoTorneo = new TorneoRepositorio();
                Torneo bTorneo = repoTorneo.ObtenerPorId(Convert.ToInt32(fila["IdTorneo"]));
                ISedeRepositorio repoSede = new SedeRepositorio();
                Sede bSede = repoSede.BuscarPorId(Convert.ToInt32(fila["IdSede"]));
                IArbitroRepositorio repoArbitro = new ArbitroRepositorio();
                Arbitro bArbitro = repoArbitro.Buscar(Convert.ToInt32(fila["DniArbitro"]));
                IInscripcionRepositorio repoInscripcion = new InscripcionRepositorio();
                List<Inscripcion> ListaInscriptos = repoInscripcion.Listar(bTorneo.Id);
                retorno = new Partido((fila.IsNull("IdPartido") == true ? 0 : Convert.ToInt32(fila["IdPartido"])), bTorneo, bSede,
                    (fila.IsNull("Fecha") == true ? DateTime.Now : Convert.ToDateTime(fila["Fecha"])), bArbitro,
                    (fila.IsNull("Ronda") == true ? 0 : Convert.ToInt32(fila["Ronda"])),"",
                    (fila.IsNull("Cancha") == true ? 0 : Convert.ToInt32(fila["Cancha"])),
                    (fila.IsNull("Estado") == true ? 0 : Convert.ToInt32(fila["Estado"])),
                    ListaInscriptos);

            }
            return retorno;
        }

        #endregion
    }
}
